<template>
  <view
    class="u-progress"
    :style="{
      borderRadius: round ? '100rpx' : 0,
      height: height + 'rpx',
      backgroundColor: inactiveColor,
    }"
  >
    <view
      :class="[
        type ? `u-type-${type}-bg` : '',
        striped ? 'u-striped' : '',
        striped && stripedActive ? 'u-striped-active' : '',
      ]"
      class="u-active"
      :style="[progressStyle]"
    >
      <slot v-if="$slots.default || $slots.$default" />
      <block v-else-if="showPercent">
        {{ percent + '%' }}
      </block>
    </view>
  </view>
</template>

<script>
/**
 * lineProgress 线型进度条
 * @description 展示操作或任务的当前进度，比如上传文件，是一个线形的进度条。
 * @tutorial https://www.uviewui.com/components/lineProgress.html
 * @property {String Number} percent 进度条百分比值，为数值类型，0-100
 * @property {Boolean} round 进度条两端是否为半圆（默认true）
 * @property {String} type 如设置，active-color值将会失效
 * @property {String} active-color 进度条激活部分的颜色（默认#19be6b）
 * @property {String} inactive-color 进度条的底色（默认#ececec）
 * @property {Boolean} show-percent 是否在进度条内部显示当前的百分比值数值（默认true）
 * @property {String Number} height 进度条的高度，单位rpx（默认28）
 * @property {Boolean} striped 是否显示进度条激活部分的条纹（默认false）
 * @property {Boolean} striped-active 条纹是否具有动态效果（默认false）
 * @example <u-line-progress :percent="70" :show-percent="true"></u-line-progress>
 */
export default {
  name: 'u-line-progress',
  props: {
    // 两端是否显示半圆形
    round: {
      type: Boolean,
      default: true,
    },
    // 主题颜色
    type: {
      type: String,
      default: '',
    },
    // 激活部分的颜色
    activeColor: {
      type: String,
      default: '#19be6b',
    },
    inactiveColor: {
      type: String,
      default: '#ececec',
    },
    // 进度百分比，数值
    percent: {
      type: Number,
      default: 0,
    },
    // 是否在进度条内部显示百分比的值
    showPercent: {
      type: Boolean,
      default: true,
    },
    // 进度条的高度，单位rpx
    height: {
      type: [Number, String],
      default: 28,
    },
    // 是否显示条纹
    striped: {
      type: Boolean,
      default: false,
    },
    // 条纹是否显示活动状态
    stripedActive: {
      type: Boolean,
      default: false,
    },
  },
  data() {
    return {}
  },
  computed: {
    progressStyle() {
      let style = {}
      style.width = this.percent + '%'
      if (this.activeColor) style.backgroundColor = this.activeColor
      return style
    },
  },
  methods: {},
}
</script>

<style lang="scss" scoped>
@import '../../libs/css/style.components.scss';

.u-progress {
  overflow: hidden;
  height: 15px;
  /* #ifndef APP-NVUE */
  display: inline-flex;
  /* #endif */
  align-items: center;
  width: 100%;
  border-radius: 100rpx;
}

.u-active {
  width: 0;
  height: 100%;
  align-items: center;
  @include vue-flex;
  justify-items: flex-end;
  justify-content: space-around;
  font-size: 20rpx;
  color: #ffffff;
  transition: all 0.4s ease;
}

.u-striped {
  background-image: linear-gradient(
    45deg,
    rgba(255, 255, 255, 0.15) 25%,
    transparent 25%,
    transparent 50%,
    rgba(255, 255, 255, 0.15) 50%,
    rgba(255, 255, 255, 0.15) 75%,
    transparent 75%,
    transparent
  );
  background-size: 39px 39px;
}

.u-striped-active {
  animation: progress-stripes 2s linear infinite;
}

@keyframes progress-stripes {
  0% {
    background-position: 0 0;
  }

  100% {
    background-position: 39px 0;
  }
}
</style>
